package com.henghai.zhenxuan.utils;

import android.os.Build;

import androidx.annotation.NonNull;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 列表过滤帮助类
 */
public class ListFilterHelper {


    /***
     *  list 集合的 过滤
     * @param list        需要被过滤的 list
     * @param collectItem 过滤条件
     * @return 返回结果集合
     */
    public static <T> List<T> filterItem(List<T> list, @NonNull ConditionCollector<T> collectItem) {
        List<T> tempList = new ArrayList<>();
        if (list.isEmpty()) {
            return tempList;
        } else {
            //java8新特性，stream流, Android 7.0 以上支持的Java 8 新特性
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                tempList = list.stream().filter(collectItem::collect)
                        .collect(Collectors.toList());
            } else {
                // 由于有些手机 有很低的版本，因此 用 Java 普通写法 也同样实现一份
                tempList = filterNormal(list, collectItem);
            }
        }
        return tempList;
    }

    /**
     * 过滤 一个 list ，普通写法
     *
     * @param list        需要被过滤的 list
     * @param collectItem 过滤条件
     * @return 返回结果集合
     */
    private static <T> List<T> filterNormal(List<T> list, ConditionCollector<T> collectItem) {
        List<T> tempList = new ArrayList<T>();
        for (T curItem : list) {
            boolean collect = collectItem.collect(curItem);
            if (collect) {
                tempList.add(curItem);// 添加到新的列表
            }
        }
        return tempList;
    }


    /**
     * 条件收集器
     */
    public interface ConditionCollector<T> {
        boolean collect(T item);
    }

    /////////////////////////////////////提供两个基本数据类型的过滤//////////////////////////////////////

    /**
     * String 类型的 list  过滤
     *
     * @param list        需要被过滤的 list
     * @param collectItem 过滤条件
     * @return 返回结果集合
     */
    public static List<String> filterStringItem(List<String> list, ConditionCollector<String> collectItem) {

        return filterItem(list, collectItem);
    }

    /**
     * Double 类型的 list  过滤
     *
     * @param list        需要被过滤的 list
     * @param collectItem 过滤条件
     * @return 返回结果集合
     */
    public static List<Double> cartesianDouble(List<Double> list, ConditionCollector<Double> collectItem) {

        return filterItem(list, collectItem);
    }

}